#include <stdio.h>//头文件
#include <stdlib.h>
#include <stddef.h>

#include "SquenceStack.h"
/**
***********************************************************************
* @brief   初始化栈
* @param   Stack *stack：栈指针， size_t capacity：栈容量
* @retval  1：初始化成功，-1：初始化失败
* @note  
***********************************************************************
*/
int initStack(Stack *stack, size_t capacity)
{
	stack->data = (int*)malloc(sizeof(int)*capacity);//申请存放栈元素的数组内存
	if(stack->data == NULL)
	{
		printf("内存申请失败");
		return -1;
	}
	stack->capacity = capacity;//初始化栈容量为capacity
	stack->length = 0;//初始化栈长度为0
	return 1;
}

/**
***********************************************************************
* @brief   动态调整存放栈元素的顺序表（数组）的内存大小
* @param   
* @retval  1：内存调整成功，-1：内存调整失败
* @note  
***********************************************************************
*/
int resizeStack(Stack *stack, size_t newCapacity)
{
	stack->data = (int*)realloc(stack->data, newCapacity*sizeof(int));
	if(stack->data == NULL)
	{
		printf("内存调整失败");
		return -1;
	}
	stack->capacity = newCapacity;
	return 1;
}

/**
***********************************************************************
* @brief   释放栈内存
* @param   Stack *stack
* @retval  无
* @note  
***********************************************************************
*/
int destroyStack(Stack *stack)
{
	/*1、判断存放栈的数组内存是否为空*/
	if(stack->data = NULL)
	{
		printf("存放栈元素的数组为空");
		return -1;
	}

	free(stack->data);//释放内存
	stack->data = NULL;
	stack->capacity = 0;
	stack->length = 0;
	printf("栈内存释放成功\n");
	return 1;
}

/**
***********************************************************************
* @brief   返回栈内元素个数
* @param   const Stack *Stack：栈结构体指针
* @retval  返回栈内元素个数
* @note  
***********************************************************************
*/
size_t getLength(const Stack *stack)
{
	return stack->length;
}

/**
***********************************************************************
* @brief   栈内添加新元素
* @param   Stack *stack：栈结构体指针, int element：需要插入的元素
* @retval  无
* @note  
***********************************************************************
*/
void push(Stack *stack, int element)
{
	/*判断是否存满啦*/
	if(stack->length == stack->capacity)
	{
		resizeStack(stack, stack->capacity + stack->capacity>>1);//扩容1.5倍
		printf("容量已满，进行扩容操作\n");
	}
	stack->data[stack->length] = element;//将元素插入栈中
	stack->length++;//栈长度加1
}

/**
***********************************************************************
* @brief   栈顶元素出栈并返回
* @param   Stack *stack：栈结构体指针, int element：需要插入的元素
* @retval  出栈元素
* @note  
***********************************************************************
*/
int pop(Stack *stack)
{
	/*判断数组内存是否为空*/
	if(stack->data == NULL)
	{
		printf("存放栈元素的数组为空");
		return -1;
	}
	/*判断栈内容是否为空*/
	if(stack->length == 0)
	{
		printf("栈内容为空，出栈失败");
		return -1;
	}

	int popElement = stack->data[stack->length-1];//返回出栈元素
	stack->length--;//栈元素长度减1
	return popElement;
	
}

/**
***********************************************************************
* @brief   遍历栈元素
* @param   Stack *stack：栈结构体指针
* @retval  
* @note  
***********************************************************************
*/
void printStack(Stack *stack)
{
	/*从栈顶到栈底遍历*/
	int i = stack->length;
	while(i--)
	{
		printf("%d\n", stack->data[i]);
	}
	/*从栈底到栈顶遍历*/
	// for(int i =0; i < stack->length; i++)
	// {
	// 	printf("%d\n", stack->data[i]);
	// }
	printf("\n");
}

